home *** CD-ROM | disk | FTP | other *** search
/ Tricks of the Mac Game Programming Gurus / TricksOfTheMacGameProgrammingGurus.iso / CodeWarrior Lite / Metrowerks C⁄C++ Lite / Headers / 68K Specific / SANE.h < prev    next >
Encoding:
C/C++ Source or Header  |  1995-04-12  |  5.7 KB  |  199 lines  |  [TEXT/MMCC]

  1. /*
  2.  *    File:        SANE.h
  3.  *                ©1993-1995 metrowerks Inc. All rights reserved
  4.  *
  5.  *    Content:    Standard Apple Numerics Environment support
  6.  *
  7.  */
  8.  
  9. #ifndef __SANE__
  10. #define __SANE__
  11.  
  12. #ifndef __TYPES__
  13. #include <Types.h>
  14. #endif
  15.  
  16. #define INF        __inf()
  17. #define PI        pi
  18.  
  19. extern const long double pi;
  20. extern long double __inf(void);
  21.  
  22. enum {    FloatDecimal,FixedDecimal };
  23. enum {    SigDigLen=20,DecStrLen=80 };
  24. enum {    GreaterThan,LessThan,EqualTo,Unordered };
  25. enum {    SNaN=1,QNaN,Infinite,ZeroNum,NormalNum,DenormalNum };
  26. enum {    ToNearest,Upward,Downward,TowardZero };
  27. enum {    ExtPrecision,DblPrecision,FloatPrecision };
  28.  
  29. typedef short RelOp;                        
  30. typedef short NumClass;                     
  31. typedef short RoundDir;                     
  32. typedef short RoundPre;                     
  33.  
  34. typedef struct Decimal {
  35.     char    sgn;                                
  36.     char    unused;
  37.     short    exp;                                
  38.     struct    {
  39.         unsigned char length;
  40.         unsigned char text[SigDigLen];        
  41.         unsigned char unused;
  42.     } sig;
  43. } Decimal;
  44.  
  45. typedef struct DecForm {
  46.     char style;
  47.     char unused;
  48.     short digits;
  49. } DecForm;
  50.  
  51. #if __MC68881__
  52.  
  53. #define INEXACT            8L
  54. #define DIVBYZERO        16L
  55. #define UNDERFLOW        32L
  56. #define OVERFLOW        64L
  57. #define INVALID            128L
  58. #define CURINEX1        256L
  59. #define CURINEX2        512L
  60. #define CURDIVBYZERO    1024L
  61. #define CURUNDERFLOW    2048L
  62. #define CUROVERFLOW        4096L
  63. #define CUROPERROR        8192L
  64. #define CURSIGNAN        16384L
  65. #define CURBSONUNOR        32768L
  66.  
  67. typedef long Exception;
  68.  
  69. typedef struct Environment {
  70.     long FPCR;
  71.     long FPSR;
  72. } Environment;
  73.  
  74. typedef struct TrapVector {
  75.     void (*unordered)(void);
  76.     void (*inexact)(void);
  77.     void (*divbyzero)(void);
  78.     void (*underflow)(void);
  79.     void (*operror)(void);
  80.     void (*overflow)(void);
  81.     void (*signan)(void);
  82. } TrapVector;
  83.  
  84. #ifdef __cplusplus
  85. extern "C" {
  86. #endif
  87.  
  88. void GetTrapVector(TrapVector *);
  89. void SetTrapVector(TrapVector *);
  90.  
  91. #ifdef __cplusplus
  92. }
  93. #endif
  94.  
  95. #else
  96.  
  97. #define IEEEDEFAULTENV    0
  98. #define INVALID            1
  99. #define UNDERFLOW        2
  100. #define OVERFLOW        4
  101. #define DIVBYZERO        8
  102. #define INEXACT            16
  103.  
  104. typedef short Exception;
  105. typedef short Environment;
  106.  
  107. typedef struct MiscHaltInfo {
  108.     unsigned short haltexceptions;
  109.     unsigned short pendingCCR;
  110.     long pendingD0;
  111. } MiscHaltInfo;
  112.  
  113. #ifdef __cplusplus
  114. extern "C" {
  115. #endif
  116.  
  117. typedef pascal void (*HaltVector)(MiscHaltInfo *,void *,void *,void *,short);
  118.  
  119. pascal void GetHaltVector(HaltVector *) = { 0x3F3C,0x0007,0xA9EB };
  120. pascal void SetHaltVector(HaltVector) = { 0x3F3C,0x0005,0xA9EB };
  121.  
  122. #ifdef __cplusplus
  123. }
  124. #endif
  125.  
  126. #endif                                        
  127.  
  128. #ifdef __cplusplus
  129. extern "C" {
  130. #endif
  131.  
  132. /*    Special conversion routines */
  133. void x96tox80(extended96 *,extended80 *);
  134. void x80tox96(extended80 *,extended96 *);
  135.  
  136. /*    FP68K functions */
  137. pascal void SetEnvironment(Environment *) = { 0x3F3C,0x0001,0xA9EB };
  138. pascal void GetEnvironment(Environment *) = { 0x3F3C,0x0003,0xA9EB };
  139. pascal void SetException(Exception *) = { 0x3F3C,0x0015,0xA9EB };
  140. pascal void TestException(Exception *) = { 0x3F3C,0x001B,0xA9EB };
  141. pascal void ProcEntry(Environment *) = { 0x3F3C,0x0017,0xA9EB }; 
  142. pascal void ProcExit(Environment *) = { 0x3F3C,0x0019,0xA9EB };
  143. pascal void Dec2Num(Decimal *,extended80 *) = { 0x3F3C,0x0009,0xA9EB };
  144. pascal void Num2Dec(DecForm *,extended80 *,Decimal *) = { 0x3F3C,0x000B,0xA9EB };
  145. pascal void Neg(extended80 *) = { 0x3F3C,0x000D,0xA9EB };
  146. pascal void Abs(extended80 *) = { 0x3F3C,0x000F,0xA9EB };
  147. pascal void CopySign(extended80 *to,extended80 *from) = { 0x3F3C,0x0011,0xA9EB };
  148. pascal void Sqrt(extended80 *) = { 0x3F3C,0x0012,0xA9EB };
  149. pascal void NextExtended(extended80 *,extended80 *) = { 0x3F3C,0x0013,0xA9EB };
  150. pascal void NextDouble(double *,double *) = { 0x3F3C,0x0813,0xA9EB }; 
  151. pascal void NextFloat(float *,float *) = { 0x3F3C,0x1013,0xA9EB };
  152. pascal void Rint(extended80 *) = { 0x3F3C,0x0014,0xA9EB };
  153. pascal void Tint(extended80 *) = { 0x3F3C,0x0016,0xA9EB };
  154. pascal void Scalb(short *,extended80 *) = { 0x3F3C,0x0018,0xA9EB };
  155. pascal void Logb(extended80 *) = { 0x3F3C,0x001A,0xA9EB };
  156. pascal void ClassFloat(float *,NumClass *) = { 0x3F3C,0x101C,0xA9EB };
  157. pascal void ClassDouble(double *,NumClass *) = { 0x3F3C,0x081C,0xA9EB };
  158. pascal void ClassComp(comp *,NumClass *) = { 0x3F3C,0x301C,0xA9EB };
  159. pascal void ClassExtended(extended80 *,NumClass *) = { 0x3F3C,0x001C,0xA9EB };
  160.  
  161. void Remainder(extended80 *source,extended80 *dest,short *quot);
  162. RelOp Relation(extended80 *source,extended80 *dest);
  163. short SignNum(extended80);
  164. void SetRound(RoundDir);
  165. RoundDir GetRound(void);
  166. void SetPrecision(RoundPre);
  167. RoundPre GetPrecision(void);
  168. extended NaN(short);
  169.  
  170. /*    DecStr68K functions */
  171. pascal void PStr2Dec(StringPtr,short *,Decimal *,Boolean *) = { 0x3F3C,0x0002,0xA9EE };
  172. pascal void CStr2Dec(char *,short *,Decimal *,Boolean *) = { 0x3F3C,0x0004,0xA9EE };
  173. pascal void Dec2Str(DecForm *,Decimal *,StringPtr) = { 0x3F3C,0x0003,0xA9EE };
  174.  
  175. /*    Elems68K functions */
  176. pascal void Ln(extended80 *) = { 0x3F3C,0x0000,0xA9EC };
  177. pascal void Log2(extended80 *) = { 0x3F3C,0x0002,0xA9EC };
  178. pascal void Ln1(extended80 *) = { 0x3F3C,0x0004,0xA9EC };
  179. pascal void Log21(extended80 *) = { 0x3F3C,0x0006,0xA9EC };
  180. pascal void Exp(extended80 *) = { 0x3F3C,0x0008,0xA9EC };
  181. pascal void Exp2(extended80 *) = { 0x3F3C,0x000A,0xA9EC };
  182. pascal void Exp1(extended80 *) = { 0x3F3C,0x000C,0xA9EC };
  183. pascal void Exp21(extended80 *) = { 0x3F3C,0x000E,0xA9EC };
  184. pascal void PowerI(short *source,extended80 *dest) = { 0x3F3C,0x8010,0xA9EC };
  185. pascal void Power(extended80 *source,extended80 *dest) = { 0x3F3C,0x8012,0xA9EC };
  186. pascal void Compound(extended80 *r,extended80 *n,extended80 *dest) = { 0x3F3C,0xC014,0xA9EC };
  187. pascal void Annuity(extended80 *r,extended80 *n,extended80 *dest) = { 0x3F3C,0xC016,0xA9EC };
  188. pascal void Sin(extended80 *) = { 0x3F3C,0x0018,0xA9EC };
  189. pascal void Cos(extended80 *) = { 0x3F3C,0x001A,0xA9EC };
  190. pascal void Tan(extended80 *) = { 0x3F3C,0x001C,0xA9EC };
  191. pascal void Atan(extended80 *) = { 0x3F3C,0x001E,0xA9EC };
  192. pascal void RandomX(extended80 *) = { 0x3F3C,0x0020,0xA9EC };
  193.  
  194. #ifdef __cplusplus
  195. }
  196. #endif
  197.  
  198. #endif
  199.